import { GetKidsList, KidBindParent, SearchUser, SignOut, UpdateUserInfo } from "../../../utils/data/apis";
import { CheckPhone, UploadFile } from "../../../utils/function/tools";
import { event } from "../../../utils/interface";
import msg from "../../../utils/model/msg";

let input: any = {};
const transfer: { [key: string]: string } = {
  '生日': 'birthday',
  '手机': 'phone',
  '监护人姓名': 'user',
  '监护人手机': 'user_phone',
  '孩子姓名': 'user',
  '孩子手机': 'user_phone',
  '备注': 'aller',
  '导师类型': 'type',
  '简历': 'resume',
  '学校': 'school',
  '班级': 'class',
  '年级': 'grade',
}
// pages/individual/setting/index.ts
Page({

  /**
   * 页面的初始数据
   */
  data: {
    userInfo: {}, // 用户信息
    id_flag: 'student', // 身份
    bindHidden: true, // 隐藏绑定弹窗
    inputItem: [''], // 控制输入内容
    imgPrefix: getApp().globalData.imgPrefix, // 不完整的图片
  },
  /**
   * @function 初始化信息列表
   */
  initData: async function () {
    const user = wx.getStorageSync('user');
    const id_flag = wx.getStorageSync('id_flag');
    if (!user || !id_flag) { //没有登陆
      await msg.Modal('登录查看更多')
      wx.navigateBack();
      return;
    }
    // 已登录
    this.setData({
      userInfo: user,
      id_flag: id_flag
    })
    // console.log("userInfo",this.data.userInfo);
    if (id_flag == 'student') {
      transfer['学校'] = 'schoolname'; // 学生表和导师表命名不统一。。。。。。。确实，一个schoolname一个school，要死了
    }
    if(id_flag == 'parent') {//家长获取孩子列表
      GetKidsList({
        id: user.id,
      })
        .then((res: any) => {
          const KidsList = res.data.data.map((item: any) => {
            return item.name+" ";
          })
          console.log('KidsList',KidsList);
          let KidsString:string = KidsList.join("");
          this.setData({
            'userInfo.kids' :KidsString,
          })
        })
    }
    console.log('个人信息', user);
  },
  /**
   * @function 修改头像
   */
  changeAvatar: function () {
    const userInfo: any = this.data.userInfo;
    const id_flag: any = this.data.id_flag;
    wx.chooseMedia({
      count: 1,
      mediaType: ['image'],
      sourceType: ['album', 'camera'],
    })
      .then((res) => {
        let file = res.tempFiles[0].tempFilePath;
        wx.navigateTo({
          url: `../../sign_up/cropper/index?file=${file}`,
          events: {
            // 剪裁回调事件
            success: async (data: { path: string }) => {
              msg.Loading();
              console.log('剪裁后的图像路径', data.path);
              const path = data.path;
              await UploadFile({
                id: userInfo.id,
                tempFilePath: path,
                id_flag: id_flag,
                fileType: '',
              })
                .then((res) => {
                  userInfo.header = `https://sanli-tracks.com${JSON.parse(res.data).allpath}`;
                  wx.setStorageSync('user', userInfo); // 更新头像
                })
              msg.HideLoading();
              msg.Success('更改成功');
              this.initData();
            },
            fail: (err: any) => {
              msg.Fail('剪裁失败')
            },
          }
        }) // 跳转剪裁
      })
      .catch(() => {
        // 未选择文件
      })
  },
  /**
   * @function 退出登录
   */
  signOut: function () {
    msg.Modal('确定要退出登录吗', '退出登录', true)
      .then((res: any) => {
        if (res.confirm) {
          // 确认退出
          msg.Loading();
          const user = wx.getStorageSync('user');
          const id_flag = wx.getStorageSync('id_flag');
          SignOut({
            id: user.id,
            modelName: id_flag == 'student' ? 'Userinfo' : id_flag == 'teacher' ? 'Teacher' : 'UserParent',
          }) // 请求后台清空openid
            .then(() => {
              wx.clearStorageSync(); // 清除登陆状态
              wx.setStorageSync('id_flag', 'student'); // 重置身份
              msg.HideLoading();
              msg.Success('已退出登录')
              setTimeout(() => {
                wx.reLaunch({
                  url: '../index'
                })
              }, 500)
            })
            .catch(() => {
              msg.HideLoading();
              msg.Fail('请求异常');
            })
        }
      })
  },
  /**
   * @function 更改弹窗状态
   */
  sheetControl: function () {
    this.setData({
      bindHidden: !this.data.bindHidden,
    })
  },
  /**
   * @function 去绑定
   */
  toBind: function () {
    const identity = this.data.id_flag;
    if(identity == 'teacher'){
      msg.Modal('老师无需进行绑定');
      return;
    }
    this.setData({
      inputItem: [this.data.id_flag == 'parent' ? '孩子姓名' : '监护人姓名', this.data.id_flag == 'parent' ? '孩子手机' : '监护人手机'],
    })
    this.sheetControl();
  },
  /**
   * @function 修改个人信息
   * @param e 
   */
  changeInfo: async function (e: event) {
    const type: any = e.currentTarget.dataset.type;
    if (type == '地址') {
      const res: any = await msg.Modal('请不要随意更改地址哦', '更改确认', true);
      if (!res.confirm || res.cancel) {
        return;
      }
    }
    this.setData({
      inputItem: [type],
    })
    this.sheetControl();
  },
  /**
   * @function 监听地区选择器改变
   * @param e 
   */
  regionChange: function (e: event) {
    const region = e.detail.value;
    input.province = region[0];
    input.city = region[1];
    input.district = region[2];
    console.log(input);
  },
  /**
   * @function 监听绑定表单输入事件
   */
  bindInput: function (e: event) {
    const type = e.detail.type;
    const value = e.detail.value;
    input[transfer[type]] = value; // 存放输入
    console.log(input);
  },
  /**
   * @function 提交修改
   */
  submit: async function () {
    const type = this.data.inputItem; // 获取更改的类型
    let userInfo: any = this.data.userInfo; // 获取原有个人信息
    const id_flag = wx.getStorageSync('id_flag'); // 获取用户身份
    let verify: boolean = false; // 合法性
    let changes: any = {}; // 存放更改内容
    if (type.length == 2) {
      // 学生家长互相绑定
      if (!input.user || !input.user_phone) {
        msg.Fail('请完整填写');
        return;
      }
      if (!CheckPhone(input.user_phone)) {
        msg.Fail('手机号有误');
        return;
      }
      // verify
      verify = true;
      // 绑定父母
      await this.kidBindParent({
        name: input.user,
        phone: input.user_phone,
      })
        .then((id: string) => {
          // 成功 更新信息
          if (id_flag == 'parent') {
            (userInfo.kids_id as string[]).push(id);
          } else {
            userInfo.parents = input.user;
            userInfo.p_phone = input.user_phone;
          }
        })
        .catch(() => {
          verify = false;
        })
    }
    else {
      // 更改信息
      if (this.data.inputItem[0] == '手机') {
        if (!input.phone || !CheckPhone(input.phone)) {
          msg.Fail('输入错误');
          return;
        }
        verify = true;
      }
      else if (this.data.inputItem[0] == '地址') {
        if (!input.province || !input.city || !input.district) {
          verify = false;
        }
        else {
          verify = true;
        }
      }
      else {
        verify = true;
        if (input.aller != void 0) {
          console.log('自动填充备注')
          input.aller = (input.aller.length == 0) ? '无' : input.aller;
        }
        for (let i in input) {
          if (input[i].length == 0) {
            verify = false;
            break;
          }
        }
      }
    }
    if (!verify) {
      // invalid
      this.sheetControl();
      return;
    }
    msg.Loading();
    for (let i in input) {
      changes[i] = input[i];
    }
    this.sheetControl(); // 收起action-sheet
    UpdateUserInfo({
      modelData: changes,
      modelName: id_flag == 'student' ? 'Userinfo' : id_flag == 'teacher' ? 'Teacher' : 'UserParent',
      id: userInfo.id
    }) // 更新个人信息
      .then((res) => {
        // 更新用户信息
        console.log(res);
        // 更新缓存
        Object.keys(changes).forEach((key: string) => {
          if (key in userInfo) {
            userInfo[key] = changes[key];
          }
        })
        wx.setStorageSync('user', userInfo);
        msg.HideLoading();
        msg.Success('更新成功');
        this.initData(); // 更新数据
      })
      .catch(() => {
        msg.HideLoading();
        msg.Modal('更新个人信息出错', '网络异常');
      })
  },
  /**
   * @function 更改导师类型
   */
  changeTeacherType: function () {
    const userInfo = wx.getStorageSync('user');
    msg.ActionSheet(['企业', '学校', '兼职'])
      .then((res: any) => {
        const type = res.tapIndex + 1;
        msg.Loading();
        UpdateUserInfo({
          modelData: { type: type },
          modelName: 'Teacher',
          id: userInfo.id,
        })
          .then(async () => {
            msg.HideLoading();
            msg.Success('更新成功');
            userInfo.type = type;
            wx.setStorageSync('user', userInfo);
            this.initData();
          })
          .catch(() => {
            msg.HideLoading();
            msg.Fail('更新失败');
          })
      }) // ActionSheet
      .catch(() => { })
  },
  /**
   * @function 孩子绑定监护人
   */
  kidBindParent: async function (data: { name: string, phone: string }): Promise<string> {
    // 搜索监护人是否存在
    return new Promise((resolve, reject) => {
      const id_flag: any = wx.getStorageSync('id_flag');
      msg.Loading();
      SearchUser({
        ...data,
        id_flag: id_flag,
      })
        .then((res: any) => {
          if (res.data.data.length == 0) {// 用户不存在
            msg.HideLoading();
            msg.Modal('用户未注册');
            reject();
            return;
          }
          // 用户存在
          const pid = id_flag == 'parent' ? (this.data.userInfo as any).id : res.data.data[0].id; // 家长id
          const id: any = id_flag == 'parent' ? res.data.data[0].id : (this.data.userInfo as any).id;
          // 发起绑定请求
          KidBindParent({
            pid: pid,//家长id
            id: id // 学生id
          })
            .then((result: any) => {
              msg.HideLoading();
              if (result.data.code == 200) {
                msg.Success('绑定成功');
                resolve(id);
                return;
              }
              msg.Fail('绑定失败');
              reject();
            })
        }) // 搜索父母成功回调
        .catch(() => {// 失败回调
          reject();
          msg.HideLoading();
          msg.Modal('获取信息失败');
        })
    })
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad() {
    this.initData();
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})